package org.seedltd.upms.service.sys;

import org.seedltd.core.base.BaseCacheService;
import org.seedltd.upms.enums.EnableStatus;
import org.seedltd.upms.model.sys.entity.SysAttachment;
import org.seedltd.upms.model.sys.vo.SysAttachmentVO;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 附件管理带缓存业务接口
 * 
 * @author laizuan
 * @since 2021/07/30
 * @version 1.0
 */
public interface SysAttachmentService extends BaseCacheService<SysAttachment, Void> {

    /**
     * 通过关联主键获取附件
     *
     * @param linkedId
     *            关联主键
     * @return 附件列表
     */
    List<SysAttachmentVO> listByLinkedId(Long linkedId);

    /**
     * 批量新增附件
     * 
     * @param files
     *            文件集合
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @param additional
     *            附加值
     * @return
     */
    boolean addBatch(MultipartFile[] files, Long linkedId, String bucket, String additional) throws IOException;

    /**
     * 批量新增附件
     * 
     * @param files
     *            文件集合
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @return
     */
    boolean addBatch(MultipartFile[] files, Long linkedId, String bucket) throws IOException;

    /**
     * 批量新增附件
     *
     * @param files
     *            文件集合
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @return
     */
    boolean addBatch(File[] files, Long linkedId, String bucket) throws IOException;

    /**
     * 批量新增附件
     *
     * @param files
     *            文件集合
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @param additional
     *            附加值
     * @return
     */
    boolean addBatch(File[] files, Long linkedId, String bucket, String additional) throws IOException;

    /**
     * 新增附件
     *
     * @param file
     *            文件
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @param additional
     *            附加值
     * @return
     */
    Long add(File file, Long linkedId, String bucket, String additional) throws IOException;
    /**
     * 新增附件
     *
     * @param file
     *            文件
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @param additional
     *            附加值
     * @return
     */
    Long add(MultipartFile file, Long linkedId, String bucket, String additional) throws IOException;

    /**
     * 新增附件
     *
     * @param file
     *            文件
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @return
     */
    Long add(File file, Long linkedId, String bucket) throws IOException;

    /**
     * 新增附件
     *
     * @param file
     *            文件
     * @param linkedId
     *            关联数据主键
     * @param bucket
     *            桶名
     * @return
     */
    Long add(MultipartFile file, Long linkedId, String bucket) throws IOException;

    /**
     * 该方法会清空缓存，务必该方法做删除操作
     * 
     * @param id
     *            附件主键
     * @param linkedId
     *            关联数据主键
     * @param removeById
     *            是否更具附件主键删除，true 更具附件主键删除{@code linkedId}只用来删除缓存。false 根据{@code linkedId}删除关联数据附件。默认是：false
     * @return 是否删除成功
     */
    boolean delete(Long id, Long linkedId, boolean removeById);

    /**
     * 新增附件
     * 
     * @param linkedId
     *            关联主键
     * @param bucket
     *            桶名称
     * @param path
     *            文件路径
     * @param fileName
     *            原文件名称
     * @param newFileName
     *            存储文件名称
     * @param fileExt
     *            文件格式
     * @param fileSize
     *            文件大小
     * @param additional
     *            附加值
     * @param sortNo
     *            排序
     * @param enabled
     *            启禁用
     * @param remark
     *            说明
     * @return 附件主键
     */
    Long add(Long linkedId, String bucket, String path, String fileName, String newFileName, String fileExt,
        Long fileSize, String additional, Integer sortNo, EnableStatus enabled, String remark);

    /**
     * 新增附件
     *
     * @param linkedId
     *            关联主键
     * @param bucket
     *            桶名称
     * @param path
     *            文件路径
     * @param fileName
     *            原文件名称
     * @param newFileName
     *            存储文件名称
     * @param fileExt
     *            文件格式
     * @param fileSize
     *            文件大小
     * @param additional
     *            附加值
     * @return 附件主键
     */
    Long add(Long linkedId, String bucket, String path, String fileName, String newFileName, String fileExt,
        Long fileSize, String additional);

    /**
     * 新增附件
     *
     * @param linkedId
     *            关联主键
     * @param bucket
     *            桶名称
     * @param path
     *            文件路径
     * @param fileName
     *            原文件名称
     * @param newFileName
     *            存储文件名称
     * @param fileSize
     *            文件大小
     * @return 附件主键
     */
    Long add(Long linkedId, String bucket, String path, String fileName, String newFileName, Long fileSize);
}